"""
Description:日志处理器
UsageExample:
    from tools.loggerHander import Logger
    logger = Logger()
    logger.info("这是一条信息日志")
    logger.error("这是一条错误日志")
"""

import logging
import os
from datetime import datetime

class Logger:
    # 默认配置
    DEFAULT_LOG_DIR = os.path.join(os.getcwd(), "logs")
    CURRENT_DATE = datetime.now().strftime("%Y-%m-%d")
    DEFAULT_LOG_FILE = os.path.join(DEFAULT_LOG_DIR, f"rpa_client_{CURRENT_DATE}.log")
    # DEFAULT_FORMAT = "%(asctime)s - %(name)s - %(levelname)s - %(message)s"
    DEFAULT_FORMAT = "[%(asctime)s][%(levelname)s]%(message)s"

    def __init__(
        self,        
        name: str = __name__,
        level: int = logging.INFO,
        use_console: bool = False,
        use_file: bool = True,
        log_dir: str = None,
        log_file: str = None,
        log_format: str = None,
    ):
        """
        初始化日志处理器

        Args:
            level: 日志级别，默认为INFO
            name: 日志器名称，默认为模块名
            use_console: 是否输出到控制台
            use_file: 是否输出到文件
            log_dir: 日志目录，默认从配置获取或使用当前目录下的logs
            log_file: 日志文件名，默认使用日期命名
            log_format: 日志格式，默认使用标准格式
        """
        self.level = level
        self.name = name
        self.use_console = use_console
        self.use_file = use_file
        self.log_dir = log_dir
        self.log_file = log_file
        self.log_format = log_format
        self.logger = self._create_logger()

    def _create_logger(self) -> logging.Logger:
        """创建并配置日志器"""
        # 创建日志器
        logger = logging.getLogger(self.name)
        logger.setLevel(self.level)
        logger.propagate = False  # 防止日志向上传播

        # 清除已有处理器
        if logger.handlers:
            logger.handlers = []

        # 获取日志文件路径
        log_file_path = self._get_log_file_path()

        # 创建格式化器
        formatter = logging.Formatter(self.log_format or self.DEFAULT_FORMAT)

        # 添加控制台处理器
        if self.use_console:
            console_handler = logging.StreamHandler()
            console_handler.setLevel(self.level)
            console_handler.setFormatter(formatter)
            logger.addHandler(console_handler)

        # 添加文件处理器
        if self.use_file and log_file_path:
            file_handler = logging.FileHandler(log_file_path, encoding="utf-8")
            file_handler.setLevel(self.level)
            file_handler.setFormatter(formatter)
            logger.addHandler(file_handler)

        return logger

    def _get_log_file_path(self) -> str:
        """获取日志文件路径"""
        try:
            # 优先使用传入的日志目录
            log_dir = self.log_dir
            if not log_dir:              
                log_dir = self.DEFAULT_LOG_DIR

            # 确保目录存在
            if not os.path.exists(log_dir):
                os.makedirs(log_dir)

            # 确定日志文件名
            if self.log_file:
                log_file = self.log_file
            else:
                current_date = datetime.now().strftime("%Y-%m-%d")
                log_file = f"rpa_client_{current_date}.log"

            return os.path.join(log_dir, log_file)

        except Exception as e:
            # 出错时使用默认日志路径
            print(f"获取日志路径失败: {e}")
            return self.DEFAULT_LOG_FILE

    # 提供快捷方法
    def debug(self, msg, *args, **kwargs):
        self.logger.debug(msg, *args, **kwargs)

    def info(self, msg, *args, **kwargs):
        self.logger.info(msg, *args, **kwargs)

    def warning(self, msg, *args, **kwargs):
        self.logger.warning(msg, *args, **kwargs)

    def error(self, msg, *args, **kwargs):
        self.logger.error(msg, *args, **kwargs)

    def critical(self, msg, *args, **kwargs):
        self.logger.critical(msg, *args, **kwargs)

    def exception(self, msg, *args, exc_info=True, **kwargs):
        self.logger.exception(msg, *args, exc_info=exc_info, **kwargs)
